package Mediadores;

import BaseDeDatos.ManejadorBD;
import GUIs.GUI_AltaCorredor;
import GUIs.GUI_BajaCorredor;
import GUIs.GUI_ListadoCorredores;
import GUIs.GUI_SeleccionCorredorAModificar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author Tinacho
 */
public class MediadorABM_Corredores implements ActionListener{
    
    private Connection conexion = null;
    private GUI_AltaCorredor gui_AltaCorredor = null;
    private GUI_BajaCorredor gui_BajaCorredor = null;
    private GUI_SeleccionCorredorAModificar gui_SeleccionAModificar = null;
    private GUI_ListadoCorredores gui_ListadoCorredores = null;
    
    
    public MediadorABM_Corredores(Connection c){
        this.conexion = c;
    }
    
    
    // ------------------------------------------------
    // -------- Seccion de Metodos Publicos
    // ------------------------------------------------
    
    
    /**
     * @brief Metodo encargado de crear la interfaz correspondiente
     *      al alta de corredores.
     */
    public void crearGUI_NuevoCorredor(){
        this.gui_AltaCorredor = new GUI_AltaCorredor();
        this.gui_AltaCorredor.setActionListeners(this);
        this.gui_AltaCorredor.setVisible(true);
    }// Fin crearGUI_NuevoCorredor
   
    
    /**
     * @throws java.sql.SQLException
     * @brief Metodo encargado de crear la interfaz correspondiente
     *      a la baja de corredores.
     */    
    public void crearGUI_BajaCorredor() throws SQLException{
        this.gui_BajaCorredor = new GUI_BajaCorredor();
        this.gui_BajaCorredor.setActionListeners(this);
        this.gui_BajaCorredor.setVisible(true);        
        this.gui_BajaCorredor.llenarTablaConCorredores(this.conexion);
    }// Fin crearGUI_BajaCorredor
    
    
    /**
     * @throws java.sql.SQLException
     * @brief Metodo encargado de crear la interfaz correspondiente
     *      a la seleccion de corredor a modificar.
     */     
    public void crearGUI_SeleccionAModificarCorredor() throws SQLException{
        this.gui_SeleccionAModificar = new GUI_SeleccionCorredorAModificar();
        this.gui_SeleccionAModificar.setActionListeners(this);
        this.gui_SeleccionAModificar.setVisible(true);        
        this.gui_SeleccionAModificar.llenarTablaConCorredores(this.conexion);
    }// Fin crearGUI_SeleccionAModificarCorredor        
 
    
    /**
     * @throws java.sql.SQLException
     * @brief Metodo encargado de crear la interfaz correspondiente
     *      al listado de corredores.
     */     
    public void crearGUI_ListadoCorredores() throws SQLException{
        this.gui_ListadoCorredores = new GUI_ListadoCorredores();
        this.gui_ListadoCorredores.setActionListeners(this);
        this.gui_ListadoCorredores.setVisible(true);
        this.gui_ListadoCorredores.llenarTablaConCorredores(this.conexion);
    }// Fin crearGUI_ListadoCorredores
    
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
              
        if (this.gui_AltaCorredor != null && this.gui_AltaCorredor.obtenerJB_Guardar() == e.getSource()) {
            System.out.println("Por tratar el evento del boton guardar!");
            tratarEventosAltaCorredor();
        }
        else{
            if(this.gui_BajaCorredor != null && this.gui_BajaCorredor.obtenerJB_Eliminar() == e.getSource()){
                tratarEventosBajaCorredor();
            }
            else{
                if(this.gui_SeleccionAModificar.obtenerJB_Modificar() == e.getSource() && this.gui_SeleccionAModificar != null){
                    tratarEventosModificarCorredor();
                }
                else{
                    if(this.gui_ListadoCorredores != null && this.gui_ListadoCorredores.obtenerJB_Cerrar() == e.getSource()){
                        tratarEventosListadoCorredor();
                    }
               }
            }
        }   
    }
    
    
    // ------------------------------------------------
    // -------- Seccion de Metodos Privados
    // ------------------------------------------------
    
    /**
     * @brief Trata los eventos que corresponden a la interfaz de nuevos
     *      corredores. En este caso, controla que los campos obligatorios
     *      no sean vacios, y a su vez, ejecuta la insercion en la base de 
     *      datos.
     */    
    private void tratarEventosAltaCorredor() {
        String dniC = this.gui_AltaCorredor.obtenerJTF_DNI();
        String nombreC = this.gui_AltaCorredor.obtenerJTF_Nombre();
        String apellidoC = this.gui_AltaCorredor.obtenerJTF_Apellido();
        if( (!esUnCampoVacio(dniC)) && (!esUnCampoVacio(nombreC)) && (!esUnCampoVacio(apellidoC)) ){
            // Control de campos obligatorios
            String categoriaC = this.gui_AltaCorredor.obtenerJCB_Categoria();
            String edadC = this.gui_AltaCorredor.obtenerJTF_Edad();
            String domicilioC = this.gui_AltaCorredor.obtenerJTF_Domicilio();
            String telefonoC = this.gui_AltaCorredor.obtenerJTF_Telefono();
            try {
                ManejadorBD manejadorC = new ManejadorBD(this.conexion);
                manejadorC.insertarCorredor(dniC, nombreC, apellidoC, categoriaC, edadC, domicilioC, telefonoC);
                JOptionPane.showMessageDialog(null,"El corredor "+nombreC+" "+ apellidoC+" fué cargado en el sistema correctamente.", "Alta de corredor satisfactoria", JOptionPane.INFORMATION_MESSAGE);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,"Se ha producido un error (SQLExc) al intentar cargar el nuevo corredor a la base de datos.", "Error nuevo corredor", JOptionPane.ERROR_MESSAGE);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null,"Se ha producido un error (IOExc) al intentar cargar el nuevo corredor a la base de datos.", "Error nuevo corredor", JOptionPane.ERROR_MESSAGE);
            }
            this.gui_AltaCorredor.dispose();
        }
        else{
            this.gui_AltaCorredor.mostrarMensajeDeError();
        }
    }// Fin tratarEventosAltaCorredor    
    
    
    /**
     * @brief Trata los eventos que corresponden a la interfaz de eliminacion
     *      de corredores. En este caso, a partir de la seleccion de la lista,
     *      ejecuta la consulta de eliminacion en la base de datos.
     */    
    private void tratarEventosBajaCorredor(){
        if(this.gui_BajaCorredor.obtenerFilaSeleccionada() >= 0){
            try {
                String dniCorredor = this.gui_BajaCorredor.obtenerDNICorredorSeleccionado();
                ManejadorBD manejadorC = new ManejadorBD(this.conexion);
                manejadorC.eliminarCorredor(dniCorredor);
                JOptionPane.showMessageDialog(null,"El corredor seleccionado ha sido eliminado correctamente de la base de datos.", "Eliminación satisfactoria", JOptionPane.INFORMATION_MESSAGE);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,"Se ha producido un error (SQLExc) al intentar eliminar el corredor de la base de datos.", "Error al eliminar corredor", JOptionPane.ERROR_MESSAGE);
            }
            this.gui_BajaCorredor.dispose();
        }
        else{
            JOptionPane.showMessageDialog(null,"Por favor, seleccione el corredor que desea eliminar.", "Selección vacía",JOptionPane.ERROR_MESSAGE);
        }
    }// Fin tratarEventosBajaCorredor      
    
    
    private void tratarEventosModificarCorredor(){
        if(this.gui_SeleccionAModificar.obtenerFilaSeleccionada() >= 0){
            try {
                String dniCorredor = this.gui_SeleccionAModificar.obtenerDNICorredorSeleccionado();
                MediadorModificarCorredor mediadorCorredor = new MediadorModificarCorredor(this.conexion, dniCorredor);
                mediadorCorredor.crearGUI_NuevoCorredor();
            }catch(SQLException ex) {
                JOptionPane.showMessageDialog(null,"Se ha producido un error (SQLExc) al intentar crear la interfaz de modificación de corredores.", "Error de interfaz", JOptionPane.ERROR_MESSAGE);
            }
        }
        else{
            JOptionPane.showMessageDialog(null,"Por favor, seleccione el corredor que desea modificar.", "Selección vacía",JOptionPane.ERROR_MESSAGE);
        }
    }
    
    
    /**
     * @brief Trata los eventos que corresponden a la interfaz de listado
     *      de corredores. En este caso, solo cierra la ventana a traves del
     *      boton.
     */
    private void tratarEventosListadoCorredor(){
        this.gui_ListadoCorredores.dispose();
    }// Fin tratarEventosListadoCorredor
    
    
    /**
     * @brief Controla que el argumento pasado como parametro no este vacio.
     * 
     * @param campo Argumento a controlar.
     * @return TRUE si el campo es vacio.
     *         FALSE caso contrario.
     */
    private boolean esUnCampoVacio(String campo){
        return (campo.compareTo("") == 0);
    }// Fin esUnCampoVacio
}
